分析一下程序的源码,程序从/dev/urandow
伪随机设备里读出16个字节,前8个字节做为文件名,后8个字节存在该文件内,最后从该文件中读出8字节与传入的参数比较,相等就get flag。
题目说了不能爆破,所以一点头绪也没有。
ulimit命令
- -a 显示目前资源限制的设定。
- -c <core文件上限> 设定core文件的最大值,单位为区块。
- -d <数据节区大小> 程序数据节区的最大值,单位为KB。
- -f <文件大小> shell所能建立的最大文件,单位为区块。
- -H 设定资源的硬性限制,也就是管理员所设下的限制。
- -m <内存大小> 指定可使用内存的上限,单位为KB。
- -n <文件数目> 指定同一时间最多可开启的文件数。
- -p <缓冲区大小> 指定管道缓冲区的大小,单位512字节。
- -s <堆叠大小> 指定堆叠的上限,单位为KB。
- -S 设定资源的弹性限制。
- -t <CPU时间> 指定CPU使用时间的上限,单位为秒。
- -u <程序数目> 用户最多可开启的程序数目。
- -v <虚拟内存大小> 指定可使用的虚拟内存上限,单位为KB。
使用ulimit -f 0
来限制进程创建文件的大小为0,这样程序在执行fclose
的时候缓冲区的内容就无法写入文件,那么最后读出来的就是0了。
直接在平台上操作
1 | otp@pwnable:~$ ulimit -f 0 |
需要注意的是,这里不能直接在shell里搞,因为这样shell会直接返回异常。
这题主要考查的问题就像flag中说的那样,没有对flcose
的返回值进行检查,导致可能文件写入失败。但是没有对ulimit
命令进行限制也是其中的一个问题。